//
//  JCGCDUtil.swift
//  JCPublicKit
//
//  Created by JasonLee on 2020/5/12.
//

import Foundation

/**
 GCD工具
 */
class JCGCDUtil: NSObject {
    // MARK: 异步执行
    /**
     异步执行
     */
    @objc static func async(onQueue queue: DispatchQueue, _ execute: @escaping () -> Void) {
        queue.async(execute: execute)
    }
    /**
     在主线程上异步执行
     */
    @objc static func async(onMainQueue execute: @escaping () -> Void) {
        DispatchQueue.main.async(execute: execute)
    }
    /**
     在自定义标签线程上异步执行
     */
    @objc static func async(onQueueByLabel label: String, _ execute: @escaping () -> Void) {
        DispatchQueue(label: label).async(execute: execute)
    }
    
    // MARK: 延迟执行
    /**
     延迟异步执行
     */
    static func asyncAfter(deadline: DispatchTime, onQueue queue: DispatchQueue, _ execute: @escaping () -> Void) {
        queue.asyncAfter(deadline: deadline, execute: execute)
    }
    
    /**
     在主线程上延迟异步执行
     */
    static func asyncAfter(deadline: DispatchTime, onMainQueue execute: @escaping () -> Void) {
        DispatchQueue.main.asyncAfter(deadline: deadline, execute: execute)
    }
    /**
     在主线程上延迟若干毫秒异步执行
     */
    @objc static func asyncAfter(milliseconds: Int, onMainQueue execute: @escaping () -> Void) {
        asyncAfter(deadline: .now() + .milliseconds(milliseconds), onMainQueue: execute)
    }
    /**
     在主线程上延迟若干秒异步执行
     */
    @objc static func asyncAfter(seconds: Int, onMainQueue execute: @escaping () -> Void) {
        asyncAfter(deadline: .now() + .seconds(seconds), onMainQueue: execute)
    }
    
    /**
     在自定义标签线程上延迟异步执行
     */
    static func asyncAfter(deadline: DispatchTime, onQueueByLabel label: String, _ execute: @escaping () -> Void) {
        asyncAfter(deadline: deadline, onQueue: DispatchQueue(label: label), execute)
    }
    /**
     在自定义标签线程上延迟若干毫秒异步执行
     */
    @objc static func asyncAfter(milliseconds: Int, onQueueByLabel label: String, _ execute: @escaping () -> Void) {
        asyncAfter(deadline: .now() + .milliseconds(milliseconds), onQueueByLabel: label, execute)
    }
    /**
     在自定义标签线程上延迟若干秒异步执行
     */
    @objc static func asyncAfter(seconds: Int, onQueueByLabel label: String, _ execute: @escaping () -> Void) {
        asyncAfter(deadline: .now() + .seconds(seconds), onQueueByLabel: label, execute)
    }
}

// MARK: - 拓展方法
/**
 在主线程异步执行
 */
func jc_async(onMainQueue execute: @escaping () -> Void) {
    JCGCDUtil.async(onMainQueue: execute)
}
/**
 在自定义标签线程上异步执行
 */
func jc_async(onQueueByLabel label: String, _ execute: @escaping () -> Void) {
    JCGCDUtil.async(onQueueByLabel: label, execute)
}

/**
 在主线程上延迟若干毫秒异步执行
 */
func jc_asyncAfter(milliseconds: Int, onMainQueue execute: @escaping () -> Void) {
    JCGCDUtil.asyncAfter(milliseconds: milliseconds, onMainQueue: execute)
}
/**
 在主线程上延迟若干秒异步执行
 */
func jc_asyncAfter(seconds: Int, onMainQueue execute: @escaping () -> Void) {
    JCGCDUtil.asyncAfter(seconds: seconds, onMainQueue: execute)
}

/**
 在自定义标签线程上延迟若干毫秒异步执行
 */
func jc_asyncAfter(milliseconds: Int, onQueueByLabel label: String, _ execute: @escaping () -> Void) {
    JCGCDUtil.asyncAfter(milliseconds: milliseconds, onQueueByLabel: label, execute)
}
/**
 在自定义标签线程上延迟若干秒异步执行
 */
func jc_asyncAfter(seconds: Int, onQueueByLabel label: String, _ execute: @escaping () -> Void) {
    JCGCDUtil.asyncAfter(seconds: seconds, onQueueByLabel: label, execute)
}
